package com.semac.server.database.fetchers;

import java.sql.ResultSet;
import java.sql.SQLException;

import com.semac.server.database.classesbase.AbstractDataFetcher;
import com.semac.server.database.classesbase.Database;
import com.semac.shared.model.Atividade;
import com.semac.shared.model.Pessoa;

public class AtividadeDataFetcher extends AbstractDataFetcher<Atividade> {

	public AtividadeDataFetcher(String whereString) {
		super(whereString);
	}

	//essa funcao eh chamada de dentro do Database.doSelect();
	@Override
	public void fetchDataFromResultSet(ResultSet resultSet) throws SQLException {
		Integer codAtividadeAtual = -1;
		Integer proximoCodAtividade;
		Atividade atividade = null;
		
		while (resultSet.next()){
			proximoCodAtividade = resultSet.getInt("codAtividade");
			
			//se é igual, soh pega o codigo do ministrante da atividade, ja
			//que uma atividade pode ter varios ministrantes, por isso 
			//a multipla quantidade de ministrantes...
			if(proximoCodAtividade == codAtividadeAtual){
				if (atividade == null)
					throw new SQLException("Ops, deu alguma porcaria no banco enquanto pegava as atividades...");
				
				//pega a pessoa relativa a esse id que foi pego...
				PessoaDataFetcher fetcher = new PessoaDataFetcher("codPessoa = " + resultSet.getInt("codMinistrante"));
				Database.getInstance().doSelect(fetcher);
				Pessoa pessoa = fetcher.getFirstOccurrence();
				if (pessoa != null)
					atividade.addMinistrante(pessoa);
				
//				atividade.addMinistrante(resultSet.getInt("codMinistrante"));
			//senao cria nova atividade e seta todas as propriedades basicas dela
			}else{
				codAtividadeAtual = proximoCodAtividade;
				atividade = new Atividade();				
				atividade.setCodSemac(resultSet.getInt("codSemana"));
				try{
					atividade.setDescricao(resultSet.getString("descricao"));
				}catch (Exception e) {}
				try{
					atividade.setTitulo(resultSet.getString("titulo"));
				}catch (Exception e) {}
				try{
					//pega a pessoa relativa a esse id que foi pego...
					PessoaDataFetcher fetcher = new PessoaDataFetcher("codPessoa = " + resultSet.getInt("codMinistrante"));
					Database.getInstance().doSelect(fetcher);
//					fetcher.getFirstOccurrence();
					Pessoa pessoa = fetcher.getFirstOccurrence();
					if (pessoa != null)
						atividade.addMinistrante(pessoa);
				}catch (Exception e) {}
				try{
					atividade.setInicioDaAtividade(resultSet.getTimestamp("dataInicio"));
				}catch (Exception e) {}
				try{
					atividade.setFimDaAtividade(resultSet.getTimestamp("dataFim"));
				}catch (Exception e) {}
				try{
					atividade.setSala(resultSet.getString("sala"));
				}catch (Exception e) {}
				try{
					atividade.setLimiteAlunos(resultSet.getInt("limiteVagas"));
				}catch (Exception e) {}
				try{
					atividade.setTemInscricao(resultSet.getBoolean("temInscricao"));
				}catch (Exception e) {
					e.printStackTrace();
				}
				atividade.setId(codAtividadeAtual);
				
				this.results.add(atividade);
			}
			
			
			
		}

	}

	@Override //colunas que vao ser selecionadas no banco
	protected String getColumnsToBeSelected() {
		return "\"atividade\".\"codAtividade\" as codAtividade, \"atividade\".\"titulo\"as titulo, " +
			   "\"atividade\".\"descricao\" as descricao, \"atividade\".\"limiteVagas\" as limiteVagas, "+
			   "\"atividade\".\"dataInicio\" as dataInicio, \"atividade\".\"dataFim\" as dataFim, " +
			   "\"tutor\".\"codPessoa\" as codMinistrante, \"atividade\".\"codSemana\" as codSemana, " +
			   "\"atividade\".\"temInscricao\" as temInscricao, \"atividade\".\"sala\" as sala";
	}

	@Override //tabelas que serao selecionadas
	protected String getTableToBeSelected() {
		return "atividade left join tutor on \"tutor\".\"codAtividade\" = \"atividade\".\"codAtividade\"";
	}

	

}
